<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

</body>
<script>
    //【1】基本介绍
    // ES6 提供了新的数据结构 Set。
    // 它类似于数组，但是成员的值都是唯一的，没有重复的值。
    //【2】初始化
    // Set 本身是一个构造函数，用来生成 Set 数据结构。
    let set = new Set();
    // Set 函数可以接受一个数组（或者具有 iterable 接口的其他数据结构）作为参数，用来初始化。
    let set1 = new Set([1, 2, 3, 4, 4]);
    console.log(set1); // Set(4) {1, 2, 3, 4}
    set2 = new Set(document.querySelectorAll('div'));
    console.log(set2.size); // 66
    set3 = new Set(new Set([1, 2, 3, 4]));
    console.log(set3.size); // 4
    //【3】属性和方法
    // 操作方法有：
    // add(value)：添加某个值，返回 Set 结构本身。
    // delete(value)：删除某个值，返回一个布尔值，表示删除是否成功。
    // has(value)：返回一个布尔值，表示该值是否为 Set 的成员。
    // clear()：清除所有成员，无返回值。
    // 举个例子：
    let set = new Set();
    console.log(set.add(1).add(2)); // Set [ 1, 2 ]
    console.log(set.delete(2)); // true
    console.log(set.has(2)); // false
    console.log(set.clear()); // undefined
    console.log(set.has(1)); // false
    // 之所以每个操作都 console 一下， 就是为了让大家注意每个操作的返回值。

    // 遍历方法有：
    // keys()： 返回键名的遍历器
    // values()： 返回键值的遍历器
    // entries()： 返回键值对的遍历器
    // forEach()： 使用回调函数遍历每个成员， 无返回值
    // 注意 keys()、 values()、 entries() 返回的是遍历器

    let set = new Set(['a', 'b', 'c']);
    console.log(set.keys()); // SetIterator {"a", "b", "c"}
    console.log([...set.keys()]); // ["a", "b", "c"]
    let set = new Set(['a', 'b', 'c']);
    console.log(set.values()); // SetIterator {"a", "b", "c"}
    console.log([...set.values()]); // ["a", "b", "c"]
    let set = new Set(['a', 'b', 'c']);
    console.log(set.entries()); // SetIterator {"a", "b", "c"}
    console.log([...set.entries()]); // [["a", "a"], ["b", "b"], ["c", "c"]]
    let set = new Set([1, 2, 3]);
    set.forEach((value, key) => console.log(key + ': ' + value));
    // 1: 1
    // 2: 2
    // 3: 3
    // 属性：

    // Set.prototype.constructor： 构造函数， 默认就是 Set 函数。
    // Set.prototype.size： 返回 Set 实例的成员总数。
</script>

</html>